<?xml version = '1.0' encoding = 'UTF-8'?>
<HBRRepo><variables><variable name="OQP_Scenario" type="member" usage="const" id="2" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Scenario</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_SCENARIO</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Version" type="member" usage="const" id="1" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Version</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_VERSION</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Year" type="member" usage="const" id="3" product="Planning"><property name="application">SalesPln</property><property name="dimension">Years</property><property name="dimensionInputMode">name</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_YEAR</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable></variables><rulesets/><rules><rule id="1" name="OQP_Waterfall Adjustment" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="customized">true</property><property name="seeded">true</property><property name="seedLockBrokenBy">demoadmin</property><variable_references><variable_reference name="OQP_Scenario" id="2"><property name="application">SalesPln</property><property name="hidden">true</property><property name="rule_name">OQP_Waterfall Adjustment</property><property name="seq">1</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">"OEP_Plan"</property></variable_reference><variable_reference name="OQP_Version" id="1"><property name="application">SalesPln</property><property name="hidden">true</property><property name="rule_name">OQP_Waterfall Adjustment</property><property name="seq">2</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">"OEP_Working"</property></variable_reference><variable_reference name="OQP_Year" id="3"><property name="application">SalesPln</property><property name="hidden">true</property><property name="rule_name">OQP_Waterfall Adjustment</property><property name="seq">3</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">"No Year"</property></variable_reference></variable_references><script type="groovy">		/*RTPS:{OQP_Version} {OQP_Scenario} {OQP_Year}*/
            /*PURPOSE: This rule allocates adjustment value accross all dimensions.*/
			def grid=operation.grid;
			List&lt;String> CustomRelDimensions=[];
			List&lt;String> ColumnDimensions=[];
			List&lt;String> CustomDimensions=[];
			List&lt;String> RowDimensions=[];
            String entity ="";
            String strEntityRow="";
			String strCrossDim = "";
			String strCrossAnyDim = "";
            String driverDimMember;
            boolean isUnitsModel=false;
			String Scenario=rtps.OQP_Scenario.member.name;
			String Version=rtps.OQP_Version.member.name;			
			String Year=rtps.OQP_Year.member.name;
            String strRowDim="";
			boolean isDataModified = false;
			int firstColumn=0;
            int firstRow=0;
            int iCnt;
			try
			{
            /*Evalute if Quota planning model is enabled for units or  Amount */
             Application app=operation.getApplication();
             Cube qtp=operation.getCube(); 
              Dimension dim=app.getDimension(DimensionType.ACCOUNT,qtp);
              if (dim.hasMember("OQP_Units",qtp)==true)
              {
                isUnitsModel=true;
                driverDimMember="OQP_Last Year Units";
              }
              else
              {
                isUnitsModel=false;
                driverDimMember="OQP_Last Year Revenue";                    
              }	
              /*Identify POV Dimensoins and their members*/
			List&lt;DataGrid.HeaderCell> hcells=grid.getPov()
			hcells.each{
				def dimName = it.getDimName();
				String mbrName=it.getMbrName();
				if (!mbrName.equals(Scenario) &amp;&amp; !mbrName.equals(Version) &amp;&amp; !it.getDimensionType().equals(DimensionType.SIMPLE_CURRENCY) &amp;&amp; !mbrName.equals(Year))
				{
					/*CustomRelDimensions.add('''@Relative("'''+mbrName+'''",0)''');*/
                    CustomRelDimensions.add('''@IDescendants("'''+mbrName+'''")''');                    
					strCrossDim= strCrossDim + "\""+ mbrName+"\"->"
					CustomDimensions.add('''"'''+dimName+'''"''');
				}					
			}		
            if (CustomRelDimensions.size()>0)
            {
                /*Identify Row Dimensions - Loops through first row of the grid to identify dimensions*/
                List&lt;DataGrid.Row> rows = grid.getRows()
                for (DataGrid.Row row : rows) 
                {
                    List&lt;DataGrid.HeaderCell> subRows = row.getHeaders();
                    for(DataGrid.HeaderCell cell : subRows) 
                      {
                      	String dimType=cell.getDimensionType();
                        String memName = cell.getDimName();  
                      if (!RowDimensions.contains(memName))
                       {
                            RowDimensions.add(memName)      	 
                       } 
                      if(dimType=="Entity")
                      {
                      		entity=memName;                            
                      }                      
                     }
                     firstRow++
                     if (firstRow==1) 
                      break;
                     
                }
				
                 /*Identify Column Dimensions  - Loops Through first column of the grid to identify dimensions*/
                List&lt;List&lt;DataGrid.HeaderCell>> cols = grid.getColumns();
                for (List&lt;DataGrid.HeaderCell> cells : cols) 
                {
                 firstColumn=0;
                    for (DataGrid.HeaderCell cell : cells)  
                      {
                       String memName = cell.getMbrName();
                       String dimName = cell.getDimName();
                       if (!ColumnDimensions.contains(dimName))
                          {
                            if (!memName.equals("YearTotal") &amp;&amp; !memName.equals(driverDimMember)  )
                            {
                                ColumnDimensions.add(dimName);
                               /* CustomRelDimensions.add('''@Relative("'''+memName+'''",0)''');*/
                                CustomRelDimensions.add('''@IDescendants("'''+memName+'''")''');
                                strCrossDim= strCrossDim + "\""+ memName+"\"->"                
                                CustomDimensions.add('''"'''+dimName+'''"''');
                            }

                         }
                       firstColumn++;
                      if (firstColumn==1) 
                      break;
                     }
                 }
                 /* Prepares strings for Changed Row Dimensions*/
                for(String dimName:RowDimensions)
                {
                    def ls=operation.grid.dataCellIterator{DataCell cell -> cell.edited}.collect([] as Set,{ DataCell cell ->
                    cell.getMemberName(dimName)
                    })
                    if (ls.size()>0)
                        {
                            isDataModified=true;
                        }
                        if (dimName==entity)
                        {
                        	strEntityRow=ls.join('''","''')                   	
                        }
                        else
                        {
                        	strRowDim=ls.join('''","''') 
                             if (!CustomDimensions.contains(dimName))
                             {
                             	CustomDimensions.add(dimName)
                             }
                            
                        }
                }
                 
                 
                /*START : Generate Calculation Script  - Main Fix*/
                StringBuilder cscript = new StringBuilder();
                cscript.append('''SET AGGMISSG ON;\n''');
                cscript.append('''SET UPDATECALC OFF;\n''');
                cscript.append('''FIX("'''+ Year +'''",''')
                cscript.append ('''"'''+Version+'''"''')
                cscript.append (''',"'''+Scenario+'''",@Relative("Yeartotal",0)''')
                if (app.getCurrencyMode()!=CurrencyMode.SINGLE_CURRENCY)
				{
					cscript.append (''',"'''+app.getDefaultCurrency()+'''"''')
				}
              	cscript.append(''',"'''+strEntityRow+'''"''' )  
				cscript.append (''')\n''')
				/* Custom dimensions fix */
                if (CustomRelDimensions.size()>0 ||RowDimensions.size()==2)
                {
                     cscript.append('''	FIX(''')                                   
                     cscript.append( CustomRelDimensions.join(''','''))
                      if (RowDimensions.size()==2)
                      {	
                      	 if (CustomRelDimensions.size()>0)
                          {
                          	cscript.append(''',"'''+strRowDim+'''"''' )
                          }
                          else
                          {
                          	cscript.append('''"'''+strRowDim+'''"''' )
                          }                          
                      }
                      cscript.append(''')\n''')
                      cscript.append('''		"OQP_Quota Adjustment Value"=''')
                      cscript.append(strCrossDim +'''"OQP_Quota Adjustment Value"->"YearTotal"*''')
                      cscript.append('''("'''+driverDimMember+'''"/''')
                      cscript.append(strCrossDim +'''"'''+driverDimMember+'''"->"YearTotal");\n''')
                      cscript.append('''	ENDFIX; \n''')
                }
                /*Aggregation on Custom dimensions              
                 if (CustomDimensions.size()>1)
             	{
                    cscript.append('''		FIX("OQP_Quota Adjustment Value")\n''')
                    for (iCnt=0;iCnt&lt;CustomDimensions.size()-1;iCnt++)
                    {
                    cscript.append('''			FIX(@RELATIVE('''+CustomDimensions[iCnt]+''',0))\n''')              
                    }                
                    for (iCnt=CustomDimensions.size()-1;iCnt>0;iCnt--)
                    {
                    cscript.append('''				AGG('''+CustomDimensions[iCnt]+''');\n''')                        
                    cscript.append('''			ENDFIX\n''')
                    }
                    cscript.append('''			AGG('''+CustomDimensions[0]+''');\n''')
                    cscript.append('''		ENDFIX\n''')
           		}
          	  if (CustomDimensions.size()==1)
           	 	{
                  cscript.append('''		FIX("OQP_Quota Adjustment Value")\n''')
                  cscript.append('''	 		AGG('''+CustomDimensions[0]+''');\n''')
                  cscript.append('''		ENDFIX\n''')            
            	}
                */ 
                cscript.append('''ENDFIX; \n''')
                if (isDataModified==true) 
                {
                println (cscript.toString())
                return cscript.toString()
                }
                else
                {
                println ("No cells modified") 
                }
            }
			}catch(all) {
				throw new HspRuntimeException('Error occured while executing business rule');
			    }

		</script></rule></rules><components/><deployobjects><deployobject product="2" application="salespln" plantype="oep_qtp" obj_id="1" obj_type="1" name="OQP_WATERFALL ADJUSTMENT"/></deployobjects></HBRRepo>